home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / k_macro.mac < prev    next >
Text File  |  1998-02-08  |  15KB  |  757 lines

  1.     .nlist
  2.  
  3.     .ifndef    __MACRO_MAC__
  4. __MACRO_MAC__    equ    0
  5.  
  6. ;----------------------------------------------------------------
  7. ;
  8. ;    構造化マクロ定義 for HAS060.X
  9. ;        1998.02.08 by M.Kamada
  10. ;
  11. ;    HAS060.X v3.09+59 以降で使用できます。
  12. ;
  13. ;    ifcc~elseifcc(elifcc)~else~endif    条件ブロック
  14. ;
  15. ;    repeat~untilcc            後ろ判定ループ
  16. ;    do~whilecc            後ろ判定ループ
  17. ;    whilecc~endwhile        前判定ループ
  18. ;
  19. ;    break                ループ脱出
  20. ;    breakcc                ループ脱出(条件付き)
  21. ;    continue            ループ条件へジャンプ
  22. ;    continuecc            ループ条件へジャンプ(条件付き)
  23. ;
  24. ;----------------------------------------------------------------
  25.  
  26. ;----------------------------------------------------------------
  27. ;
  28. ;    変数(ユーザは参照禁止)
  29. ;
  30. ;        ~km_s_condN    条件用のスタック(2個ずつ使う)
  31. ;                (+0=else,+1=endif)
  32. ;        ~km_s_loopN    ループ用のスタック(3個ずつ使う)
  33. ;                (+0=ループの先頭,+1=continue,+2=break)
  34. ;        ~km_s_repeatN    repeat~untilcc用のスタック(1個ずつ使う)
  35. ;                (ループの先頭のラベルの番号)
  36. ;        ~km_s_doN    do~whilecc用のスタック(1個ずつ使う)
  37. ;                (ループの先頭のラベルの番号)
  38. ;        ~km_s_whileN    whilecc~endwhile用のスタック(1個ずつ使う)
  39. ;                (ループの先頭のラベルの番号)
  40. ;
  41. ;        ~km_l_cond    条件のネスティングレベル(0~)
  42. ;        ~km_l_loop    ループのネスティングレベル(0~)
  43. ;        ~km_l_repeat    repeat~untilccのネスティングレベル(0~)
  44. ;        ~km_l_do    do~whileccのネスティングレベル(0~)
  45. ;        ~km_l_while    whilecc~endwhileのネスティングレベル(0~)
  46. ;
  47. ;        ~km_n        次に使うラベルの番号(常にインクリメント)
  48. ;
  49. ;        ~km_i        汎用
  50. ;        ~km_j        汎用
  51. ;
  52. ;----------------------------------------------------------------
  53. ;
  54. ;    ラベル(ユーザは参照禁止)
  55. ;
  56. ;        ~km_aN        共通ラベル
  57. ;
  58. ;----------------------------------------------------------------
  59. ;
  60. ;    マクロ(ユーザは使用禁止)
  61. ;
  62. ;        ~km_push t,d,p0,p1,p2
  63. ;                スタックの先頭にデータをプッシュする
  64. ;                    t    タイプ(_cond,_loop,_repeat,_do,_while)
  65. ;                    d    深さ
  66. ;                    p0    スタックの先頭に置くデータ
  67. ;                    p1    スタックの先頭+1に置くデータ
  68. ;                    p2    スタックの先頭+2に置くデータ
  69. ;
  70. ;        ~km_pop t,d    スタックの先頭のデータを捨てる
  71. ;                    t    タイプ(_cond,_loop,_repeat,_do,_while)
  72. ;                    d    深さ
  73. ;
  74. ;----------------------------------------------------------------
  75.  
  76. ;----------------------------------------------------------------
  77. ;
  78. ;    初期化
  79. ;
  80. ;----------------------------------------------------------------
  81. ;マクロの構造上,スタックの先頭を初期化しておく必要がある
  82.     ~km_s_cond0:=0        ;条件用のスタック(2個ずつ使う)
  83.     ~km_s_loop0:=0        ;ループ用のスタック(3個ずつ使う)
  84.     ~km_s_repeat0:=0    ;repeat~untilcc用のスタック(1個ずつ使う)
  85.     ~km_s_do0:=0        ;do~whilecc用のスタック(1個ずつ使う)
  86.     ~km_s_while0:=0        ;whilecc~endwhile用のスタック(1個ずつ使う)
  87.  
  88. ;ネスティングレベルの初期化
  89.     ~km_l_cond:=0        ;条件のネスティングレベル(0~)
  90.     ~km_l_loop:=0        ;ループのネスティングレベル(0~)
  91.     ~km_l_repeat:=0        ;repeat~untilccのネスティングレベル(0~)
  92.     ~km_l_do:=0        ;do~whileccのネスティングレベル(0~)
  93.     ~km_l_while:=0        ;whilecc~endwhileのネスティングレベル(0~)
  94.  
  95. ;ラベルの番号の初期化
  96.     ~km_n:=1        ;次に使うラベルの番号(常にインクリメント)
  97.  
  98. ;----------------------------------------------------------------
  99. ;
  100. ;    スタック操作マクロ
  101. ;
  102. ;----------------------------------------------------------------
  103. ~km_push    .macro    t,d,p0,p1,p2
  104.     ~km_i:=~km_l&t-1
  105.     .rept    ~km_l&t
  106.         ~km_j:=~km_i+d
  107.         ~km_s&t%~km_j:=~km_s&t%~km_i
  108.         ~km_i:=~km_i-1
  109.     .endm
  110.     ~km_l&t:=~km_l&t+d
  111.     .if    d>=1
  112.         ~km_j:=0
  113.         ~km_s&t%~km_j:=p0
  114.     .endif
  115.     .if    d>=2
  116.         ~km_j:=1
  117.         ~km_s&t%~km_j:=p1
  118.     .endif
  119.     .if    d>=3
  120.         ~km_j:=2
  121.         ~km_s&t%~km_j:=p2
  122.     .endif
  123. .endm
  124.  
  125. ~km_pop    .macro    t,d
  126.     ~km_l&t:=~km_l&t-d
  127.     ~km_i:=d
  128.     .rept    ~km_l&t
  129.         ~km_j:=~km_i-d
  130.         ~km_s&t%~km_j:=~km_s&t%~km_i
  131.         ~km_i:=~km_i+1
  132.     .endm
  133. .endm
  134.  
  135. ;----------------------------------------------------------------
  136. ;    ifcc~elseifcc(elifcc)~else~endif    条件ブロック
  137. ;
  138. ;            ifcc    <命令>,…
  139. ;                :
  140. ;            elseifcc    <命令>,…
  141. ;                :
  142. ;            else
  143. ;                :
  144. ;            endif
  145. ;
  146. ;    条件が満たされているブロックだけを実行するようなコードを生成します.
  147. ;    elseifccはelifccと省略できます.
  148. ;
  149. ;    生成される構造:
  150. ;            <命令>,…
  151. ;            JBNcc    else1
  152. ;                :
  153. ;            JBRA    endif
  154. ;        else1:    <命令>,…
  155. ;            JBNcc    else2
  156. ;                :
  157. ;            JBRA    endif
  158. ;        else2:        :
  159. ;        endif:
  160. ;
  161. ;    条件になる命令は,
  162. ;        <~>で囲って指定します.
  163. ;        複数の命令を記述できます(0個以上10個以下).
  164. ;        最後の命令を通過した直後の状態に従って分岐します.
  165. ;----------------------------------------------------------------
  166.     .irp %cc,t,f,hi,ls,cc,hs,cs,lo,ne,nz,eq,ze,vc,vs,pl,mi,ge,lt,gt,le
  167.  
  168. if%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  169.     .sizem    sz
  170.     ~km_push    _cond,2,~km_n,~km_n+1
  171.     ~km_n:=~km_n+2
  172.     op0
  173.     op1
  174.     op2
  175.     op3
  176.     op4
  177.     op5
  178.     op6
  179.     op7
  180.     op8
  181.     op9
  182.     .if    '%cc'='t'
  183.     .elseif    '%cc'='f'
  184.         jbra&&sz    ~km_a%~km_s_cond0
  185.     .else
  186.         jbn%cc&&sz    ~km_a%~km_s_cond0
  187.     .endif
  188. .endm
  189.  
  190. ifn%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  191.     .sizem    sz
  192.     ~km_push    _cond,2,~km_n,~km_n+1
  193.     ~km_n:=~km_n+2
  194.     op0
  195.     op1
  196.     op2
  197.     op3
  198.     op4
  199.     op5
  200.     op6
  201.     op7
  202.     op8
  203.     op9
  204.     .if    '%cc'='t'
  205.         jbra&&sz    ~km_a%~km_s_cond0
  206.     .elseif    '%cc'='f'
  207.     .else
  208.         jb%cc&&sz    ~km_a%~km_s_cond0
  209.     .endif
  210. .endm
  211.  
  212. elseif%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  213.     .sizem    sz
  214.     .if    ~km_l_cond=0
  215.         .fail    1        ;elseifに対応するifがない
  216.         .exitm
  217.     .endif
  218.     jbra&&sz    ~km_a%~km_s_cond1
  219. ~km_a%~km_s_cond0:
  220.     ~km_s_cond0:=~km_n
  221.     ~km_n:=~km_n+1
  222.     op0
  223.     op1
  224.     op2
  225.     op3
  226.     op4
  227.     op5
  228.     op6
  229.     op7
  230.     op8
  231.     op9
  232.     .if    '%cc'='t'
  233.     .elseif    '%cc'='f'
  234.         jbra&&sz    ~km_a%~km_s_cond0
  235.     .else
  236.         jbn%cc&&sz    ~km_a%~km_s_cond0
  237.     .endif
  238. .endm
  239.  
  240. elseifn%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  241.     .sizem    sz
  242.     .if    ~km_l_cond=0
  243.         .fail    1        ;elseifに対応するifがない
  244.         .exitm
  245.     .endif
  246.     jbra&&sz    ~km_a%~km_s_cond1
  247. ~km_a%~km_s_cond0:
  248.     ~km_s_cond0:=~km_n
  249.     ~km_n:=~km_n+1
  250.     op0
  251.     op1
  252.     op2
  253.     op3
  254.     op4
  255.     op5
  256.     op6
  257.     op7
  258.     op8
  259.     op9
  260.     .if    '%cc'='t'
  261.         jbra&&sz    ~km_a%~km_s_cond0
  262.     .elseif    '%cc'='f'
  263.     .else
  264.         jb%cc&&sz    ~km_a%~km_s_cond0
  265.     .endif
  266. .endm
  267.  
  268. elif%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  269.     .sizem    sz
  270.     .if    ~km_l_cond=0
  271.         .fail    1        ;elseifに対応するifがない
  272.         .exitm
  273.     .endif
  274.     jbra&&sz    ~km_a%~km_s_cond1
  275. ~km_a%~km_s_cond0:
  276.     ~km_s_cond0:=~km_n
  277.     ~km_n:=~km_n+1
  278.     op0
  279.     op1
  280.     op2
  281.     op3
  282.     op4
  283.     op5
  284.     op6
  285.     op7
  286.     op8
  287.     op9
  288.     .if    '%cc'='t'
  289.     .elseif    '%cc'='f'
  290.         jbra&&sz    ~km_a%~km_s_cond0
  291.     .else
  292.         jbn%cc&&sz    ~km_a%~km_s_cond0
  293.     .endif
  294. .endm
  295.  
  296. elifn%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  297.     .sizem    sz
  298.     .if    ~km_l_cond=0
  299.         .fail    1        ;elseifに対応するifがない
  300.         .exitm
  301.     .endif
  302.     jbra&&sz    ~km_a%~km_s_cond1
  303. ~km_a%~km_s_cond0:
  304.     ~km_s_cond0:=~km_n
  305.     ~km_n:=~km_n+1
  306.     op0
  307.     op1
  308.     op2
  309.     op3
  310.     op4
  311.     op5
  312.     op6
  313.     op7
  314.     op8
  315.     op9
  316.     .if    '%cc'='t'
  317.         jbra&&sz    ~km_a%~km_s_cond0
  318.     .elseif    '%cc'='f'
  319.     .else
  320.         jb%cc&&sz    ~km_a%~km_s_cond0
  321.     .endif
  322. .endm
  323.  
  324.     .endm
  325.  
  326. else    .macro
  327.     .sizem    sz
  328.     .if    ~km_l_cond=0
  329.         .fail    1        ;elseに対応するifがない
  330.         .exitm
  331.     .endif
  332.     .if    ~km_s_cond0=0
  333.         .fail    1        ;elseが重複している
  334.         .exitm
  335.     .endif
  336.     jbra&sz    ~km_a%~km_s_cond1
  337. ~km_a%~km_s_cond0:
  338.     ~km_s_cond0:=0
  339.     .endm
  340.  
  341. endif    .macro
  342.     .if    ~km_l_cond=0
  343.         .fail    1        ;endifに対応するifがない
  344.         .exitm
  345.     .endif
  346.     .if    ~km_s_cond0
  347. ~km_a%~km_s_cond0:
  348.     .endif
  349. ~km_a%~km_s_cond1:
  350.     ~km_pop    _cond,2
  351.     .endm
  352.  
  353. ;----------------------------------------------------------------
  354. ;    repeat~untilcc            後ろ判定ループ
  355. ;
  356. ;            repeat
  357. ;                :
  358. ;            untilcc    <命令>,…
  359. ;
  360. ;    条件が満たされるまでループするようなコードを生成します.
  361. ;    do~whileccとは条件が逆になります.
  362. ;
  363. ;    生成される構造:
  364. ;        loop:
  365. ;                :
  366. ;        continue:
  367. ;            <命令>,…
  368. ;            JBNcc    loop
  369. ;        break:
  370. ;
  371. ;    条件になる命令は,
  372. ;        <~>で囲って指定します.
  373. ;        複数の命令を記述できます(0個以上10個以下).
  374. ;        最後の命令を通過した直後の状態に従って分岐します.
  375. ;----------------------------------------------------------------
  376. repeat    .macro
  377.     ~km_push    _loop,3,~km_n,~km_n+1,~km_n+2
  378.     ~km_n:=~km_n+3
  379. ~km_a%~km_s_loop0:
  380.     ~km_push    _repeat,1,~km_s_loop0
  381.     .endm
  382.  
  383.     .irp %cc,t,f,hi,ls,cc,hs,cs,lo,ne,nz,eq,ze,vc,vs,pl,mi,ge,lt,gt,le
  384.  
  385. until%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  386.     .sizem    sz
  387.     .if    ~km_l_repeat=0
  388.         .fail    1        ;untilccに対応するrepeatがない
  389.         .exitm
  390.     .endif
  391.     .if    ~km_s_repeat0<>~km_s_loop0
  392.         .fail    1        ;repeat~untilccの対応がおかしい
  393.         .exitm
  394.     .endif
  395.     ~km_pop    _repeat,1
  396. ~km_a%~km_s_loop1:
  397.     op0
  398.     op1
  399.     op2
  400.     op3
  401.     op4
  402.     op5
  403.     op6
  404.     op7
  405.     op8
  406.     op9
  407.     .if    '%cc'='t'
  408.     .elseif    '%cc'='f'
  409.         jbra&&sz    ~km_a%~km_s_loop0
  410.     .else
  411.         jbn%cc&&sz    ~km_a%~km_s_loop0
  412.     .endif
  413. ~km_a%~km_s_loop2:
  414.     ~km_pop    _loop,3
  415. .endm
  416.  
  417. untiln%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  418.     .sizem    sz
  419.     .if    ~km_l_repeat=0
  420.         .fail    1        ;untilccに対応するrepeatがない
  421.         .exitm
  422.     .endif
  423.     .if    ~km_s_repeat0<>~km_s_loop0
  424.         .fail    1        ;repeat~untilccの対応がおかしい
  425.         .exitm
  426.     .endif
  427.     ~km_pop    _repeat,1
  428. ~km_a%~km_s_loop1:
  429.     op0
  430.     op1
  431.     op2
  432.     op3
  433.     op4
  434.     op5
  435.     op6
  436.     op7
  437.     op8
  438.     op9
  439.     .if    '%cc'='t'
  440.         jbra&&sz    ~km_a%~km_s_loop0
  441.     .elseif    '%cc'='f'
  442.     .else
  443.         jb%cc&&sz    ~km_a%~km_s_loop0
  444.     .endif
  445. ~km_a%~km_s_loop2:
  446.     ~km_pop    _loop,3
  447. .endm
  448.  
  449.     .endm
  450.  
  451. ;----------------------------------------------------------------
  452. ;    do~whilecc            後ろ判定ループ
  453. ;
  454. ;            do
  455. ;                :
  456. ;            whilecc    <命令>,…
  457. ;
  458. ;    条件が満たされている間だけループするようなコードを生成します.
  459. ;    repeat~untilccとは条件が逆になります.
  460. ;
  461. ;    生成される構造:
  462. ;        loop:
  463. ;                :
  464. ;        continue:
  465. ;            <命令>,…
  466. ;            JBcc    loop
  467. ;        break:
  468. ;
  469. ;    条件になる命令は,
  470. ;        <~>で囲って指定します.
  471. ;        複数の命令を記述できます(0個以上10個以下).
  472. ;        最後の命令を通過した直後の状態に従って分岐します.
  473. ;----------------------------------------------------------------
  474. ;    whilecc~endwhile        前判定ループ
  475. ;
  476. ;            whilecc    <命令>,…
  477. ;                :
  478. ;            endwhile
  479. ;
  480. ;    条件が満たされている間だけループするようなコードを生成します.
  481. ;
  482. ;    生成される構造:
  483. ;        loop:
  484. ;        continue:
  485. ;            <命令>,…
  486. ;            JBNcc    break
  487. ;                :
  488. ;            JBRA    loop
  489. ;        break:
  490. ;
  491. ;    マクロの構造の都合で,
  492. ;    条件判定をループの末尾に配置するような生成方法にはなっていません.
  493. ;
  494. ;    条件になる命令は,
  495. ;        <~>で囲って指定します.
  496. ;        複数の命令を記述できます(0個以上10個以下).
  497. ;        最後の命令を通過した直後の状態に従って分岐します.
  498. ;----------------------------------------------------------------
  499. do    .macro
  500.     ~km_push    _loop,3,~km_n,~km_n+1,~km_n+2
  501.     ~km_n:=~km_n+3
  502. ~km_a%~km_s_loop0:
  503.     ~km_push    _do,1,~km_s_loop0
  504.     .endm
  505.  
  506.     .irp %cc,t,f,hi,ls,cc,hs,cs,lo,ne,nz,eq,ze,vc,vs,pl,mi,ge,lt,gt,le
  507.  
  508. while%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  509.     .sizem    sz
  510.     .if    (~km_l_do=0).or.(~km_s_do0<>~km_s_loop0)
  511. ;whileccに対応するdoがない,または,do~whileccの対応がおかしいとき,
  512. ;whilecc~endwhileと認識する
  513.         ~km_push    _loop,3,~km_n,~km_n+1,~km_n+2
  514.         ~km_n:=~km_n+3
  515. ~km_a%~km_s_loop0:
  516. ~km_a%~km_s_loop1:
  517.         op0
  518.         op1
  519.         op2
  520.         op3
  521.         op4
  522.         op5
  523.         op6
  524.         op7
  525.         op8
  526.         op9
  527.         .if    '%cc'='t'
  528.         .elseif    '%cc'='f'
  529.             jbra&&sz    ~km_a%~km_s_loop2
  530.         .else
  531.             jbn%cc&&sz    ~km_a%~km_s_loop2
  532.         .endif
  533.         ~km_push    _while,1,~km_s_loop0
  534.     .else
  535. ;do~whileccのとき
  536.         ~km_pop    _do,1
  537. ~km_a%~km_s_loop1:
  538.         op0
  539.         op1
  540.         op2
  541.         op3
  542.         op4
  543.         op5
  544.         op6
  545.         op7
  546.         op8
  547.         op9
  548.         .if    '%cc'='t'
  549.             jbra&&sz    ~km_a%~km_s_loop0
  550.         .elseif    '%cc'='f'
  551.         .else
  552.             jb%cc&&sz    ~km_a%~km_s_loop0
  553.         .endif
  554. ~km_a%~km_s_loop2:
  555.         ~km_pop    _loop,3
  556.     .endif
  557. .endm
  558.  
  559. whilen%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  560.     .sizem    sz
  561.     .if    (~km_l_do=0).or.(~km_s_do0<>~km_s_loop0)
  562. ;whileccに対応するdoがない,または,do~whileccの対応がおかしいとき,
  563. ;whilecc~endwhileと認識する
  564.         ~km_push    _loop,3,~km_n,~km_n+1,~km_n+2
  565.         ~km_n:=~km_n+3
  566. ~km_a%~km_s_loop0:
  567. ~km_a%~km_s_loop1:
  568.         op0
  569.         op1
  570.         op2
  571.         op3
  572.         op4
  573.         op5
  574.         op6
  575.         op7
  576.         op8
  577.         op9
  578.         .if    '%cc'='t'
  579.         .elseif    '%cc'='f'
  580.             jbra&&sz    ~km_a%~km_s_loop2
  581.         .else
  582.             jb%cc&&sz    ~km_a%~km_s_loop2
  583.         .endif
  584.         ~km_push    _while,1,~km_s_loop0
  585.     .else
  586. ;do~whileccのとき
  587.         ~km_pop    _do,1
  588. ~km_a%~km_s_loop1:
  589.         op0
  590.         op1
  591.         op2
  592.         op3
  593.         op4
  594.         op5
  595.         op6
  596.         op7
  597.         op8
  598.         op9
  599.         .if    '%cc'='t'
  600.         .elseif    '%cc'='f'
  601.             jbra&&sz    ~km_a%~km_s_loop0
  602.         .else
  603.             jbn%cc&&sz    ~km_a%~km_s_loop0
  604.         .endif
  605. ~km_a%~km_s_loop2:
  606.         ~km_pop    _loop,3
  607.     .endif
  608. .endm
  609.  
  610.     .endm
  611.  
  612. endwhile    .macro
  613.     .sizem    sz
  614.     .if    ~km_l_while=0
  615.         .fail    1        ;endwhileに対応するwhileがない
  616.         .exitm
  617.     .endif
  618.     .if    ~km_s_while0<>~km_s_loop0
  619.         .fail    1        ;while~endwhileの対応がおかしい
  620.         .exitm
  621.     .endif
  622.     ~km_pop    _while,1
  623.     jbra&sz    ~km_a%~km_s_loop0
  624. ~km_a%~km_s_loop2:
  625.     ~km_pop    _loop,3
  626. .endm
  627.  
  628. ;----------------------------------------------------------------
  629. ;    break                ループ脱出
  630. ;
  631. ;            break
  632. ;
  633. ;    無条件に一番内側のループを脱出するようなコードを生成します.
  634. ;
  635. ;    生成される構造:
  636. ;            jbra    break
  637. ;
  638. ;----------------------------------------------------------------
  639. ;    breakcc                ループ脱出(条件付き)
  640. ;
  641. ;            breakcc    <命令>,…
  642. ;
  643. ;    条件が成立したら一番内側のループを脱出するようなコードを生成します.
  644. ;
  645. ;    生成される構造:
  646. ;            <命令>,…
  647. ;            JBcc    break
  648. ;
  649. ;    条件になる命令は,
  650. ;        <~>で囲って指定します.
  651. ;        複数の命令を記述できます(0個以上10個以下).
  652. ;        最後の命令を通過した直後の状態に従って分岐します.
  653. ;----------------------------------------------------------------
  654. break    .macro
  655.     .sizem    sz
  656.     .if    ~km_l_loop=0
  657.         .fail    1        ;breakすべきループがない
  658.         .exitm
  659.     .endif
  660.     jbra&sz    ~km_a%~km_s_loop2
  661. .endm
  662.  
  663.     .irp %cc,t,f,hi,ls,cc,hs,cs,lo,ne,nz,eq,ze,vc,vs,pl,mi,ge,lt,gt,le
  664.  
  665. break%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  666.     .sizem    sz
  667.     .if    ~km_l_loop=0
  668.         .fail    1        ;breakすべきループがない
  669.         .exitm
  670.     .endif
  671.     op0
  672.     op1
  673.     op2
  674.     op3
  675.     op4
  676.     op5
  677.     op6
  678.     op7
  679.     op8
  680.     op9
  681.     .if    '%cc'='t'
  682.         jbra&&sz    ~km_a%~km_s_loop2
  683.     .elseif    '%cc'='f'
  684.     .else
  685.         jb%cc&&sz    ~km_a%~km_s_loop2
  686.     .endif
  687. .endm
  688.  
  689.     .endm
  690.  
  691. ;----------------------------------------------------------------
  692. ;    continue            ループ条件へジャンプ
  693. ;
  694. ;            continue
  695. ;
  696. ;    無条件に一番内側のループの条件判定にジャンプするようなコードを生成します.
  697. ;
  698. ;    生成される構造:
  699. ;            JBRA    continue
  700. ;----------------------------------------------------------------
  701. ;    continuecc            ループ条件へジャンプ(条件付き)
  702. ;
  703. ;            continuecc    <命令>,…
  704. ;
  705. ;    条件が成立したら一番内側のループの条件判定にジャンプするようなコードを生成します.
  706. ;
  707. ;    生成される構造:
  708. ;            <命令>,…
  709. ;            JBcc    continue
  710. ;
  711. ;    条件になる命令は,
  712. ;        <~>で囲って指定します.
  713. ;        複数の命令を記述できます(0個以上10個以下).
  714. ;        最後の命令を通過した直後の状態に従って分岐します.
  715. ;----------------------------------------------------------------
  716. continue    .macro
  717.     .sizem    sz
  718.     .if    ~km_l_loop=0
  719.         .fail    1        ;continueすべきループがない
  720.         .exitm
  721.     .endif
  722.     jbra&sz    ~km_a%~km_s_loop1
  723. .endm
  724.  
  725.     .irp %cc,t,f,hi,ls,cc,hs,cs,lo,ne,nz,eq,ze,vc,vs,pl,mi,ge,lt,gt,le
  726.  
  727. continue%cc    .macro    op0,op1,op2,op3,op4,op5,op6,op7,op8,op9
  728.     .sizem    sz
  729.     .if    ~km_l_loop=0
  730.         .fail    1        ;continueすべきループがない
  731.         .exitm
  732.     .endif
  733.     op0
  734.     op1
  735.     op2
  736.     op3
  737.     op4
  738.     op5
  739.     op6
  740.     op7
  741.     op8
  742.     op9
  743.     .if    '%cc'='t'
  744.         jbra&&sz    ~km_a%~km_s_loop1
  745.     .elseif    '%cc'='f'
  746.     .else
  747.         jb%cc&&sz    ~km_a%~km_s_loop1
  748.     .endif
  749. .endm
  750.  
  751.     .endm
  752.  
  753. ;----------------------------------------------------------------
  754.     .endif
  755.  
  756.     .list
  757.